package br.edu.universo.si.projeto2.infojob.client.apresentacao;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import br.edu.universo.si.projeto2.infojob.client.bean.BeanProfissionalCurriculo;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.ConfirmationDialogBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.ErrorDialogBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.InformationDialogBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.SuccessDialogBox;
import br.edu.universo.si.projeto2.infojob.client.componentes.dialogboxes.ConfirmationDialogBox.ConfirmCallback;
import br.edu.universo.si.projeto2.infojob.client.util.Util;

import com.google.gwt.user.client.Command;
import com.google.gwt.user.client.DeferredCommand;
import com.google.gwt.user.client.Window;
import com.google.gwt.user.client.WindowResizeListener;
import com.google.gwt.user.client.rpc.AsyncCallback;
import com.google.gwt.user.client.ui.Button;
import com.google.gwt.user.client.ui.ClickListener;
import com.google.gwt.user.client.ui.DockPanel;
import com.google.gwt.user.client.ui.FlexTable;
import com.google.gwt.user.client.ui.HTML;
import com.google.gwt.user.client.ui.HasHorizontalAlignment;
import com.google.gwt.user.client.ui.HasVerticalAlignment;
import com.google.gwt.user.client.ui.HorizontalPanel;
import com.google.gwt.user.client.ui.SourcesTableEvents;
import com.google.gwt.user.client.ui.TableListener;
import com.google.gwt.user.client.ui.VerticalPanel;
import com.google.gwt.user.client.ui.Widget;

public class ACurriculos extends DockPanel implements WindowResizeListener {

	private static int pastRow = -1;
	private static FlexTable resultadoGrid;
	private static List<BeanProfissionalCurriculo> listCurriculo = new ArrayList<BeanProfissionalCurriculo>();
	private BeanProfissionalCurriculo bprofissionalCur;
	private Button btnCadCurriculo;
	private Button btnExcluirCurriculo;
	private Button btnVerdetalhes;
	private Button btnRefreshGrid;
	private Integer row = 3;
	private static int idprofassinante;
	private Integer linhaSelecionada;

	public ACurriculos(Integer idProfissionalAssinante) {

		VerticalPanel vp = new VerticalPanel();

		idprofassinante = idProfissionalAssinante;
		btnCadCurriculo = new Button("Cadastrar");
		btnExcluirCurriculo = new Button("Excluir");
		btnVerdetalhes = new Button("Detalhes");
		btnRefreshGrid = new Button("Refresh");
		btnRefreshGrid.setVisible(false);

		resultadoGrid = new FlexTable();
		resultadoGrid.setCellPadding(7);
		resultadoGrid.setCellSpacing(0);
		resultadoGrid.setWidth("900px");

		setarEstiloGrid();

		// COLUNAS DA GRID
		resultadoGrid.setWidget(0, 0, new HTML("ID"));
		resultadoGrid.setWidget(0, 1, new HTML("Data Criação"));
		resultadoGrid.setWidget(0, 2, new HTML("Data Ultima Atualização"));
		resultadoGrid.setWidget(0, 3, new HTML("Comentario"));
		resultadoGrid.getFlexCellFormatter().setVisible(0, 0, false);
		resultadoGrid.setSize("100%", "100%");
		Window.addWindowResizeListener(this);
		DeferredCommand.addCommand(new Command() {
			public void execute() {
				onWindowResized(Window.getClientWidth(), Window
						.getClientHeight());
			}
		});

		onWindowResized(Window.getClientWidth(), Window.getClientHeight());

		carregarGridCurriculo();

		resultadoGrid.addTableListener(new TableListener() {
			public void onCellClicked(SourcesTableEvents sender, int row,
					int cell) {
				if (row > 0 && row <= listCurriculo.size()) {
					setarEstiloLinhaSelecionada(row);
					setLinhaSelecionada(row);
					setBprofissionalCur(listCurriculo.get(row - 1));
					btnCadCurriculo.setText("Alterar");
					if (listCurriculo.size() > 0) {
						habilitarBotoes(true);
					} else {
						habilitarBotoes(false);
					}
				} else {
					btnCadCurriculo.setText("Cadastrar");
					bprofissionalCur = null;
				}
			}

		});

		btnCadCurriculo.addClickListener(new ClickListener() {
			public void onClick(Widget sender) {

				AProfissionalCurriculo vprofcur = new AProfissionalCurriculo(
						getBprofissionalCur());
				vprofcur.setViewCurriculo(ACurriculos.this);
				vprofcur.center();
				vprofcur.show();

			}
		});
		btnExcluirCurriculo.addClickListener(new ClickListener() {
			public void onClick(Widget sender) {
				if (bprofissionalCur != null) {
					ConfirmationDialogBox confirmacao = new ConfirmationDialogBox(
							"Currículo(s) excluído(s).", new ConfirmCallback() {
								public void execute(String btnId) {
									if (btnId.equalsIgnoreCase("s")) {
										AsyncCallback<Boolean> callbackExclusao = new AsyncCallback<Boolean>() {
											public void onSuccess(Boolean result) {
												SuccessDialogBox sucesso = new SuccessDialogBox(
														"Curriculo excluido com sucesso");
												sucesso.center();
												sucesso.show();
												resultadoGrid
														.removeRow(getLinhaSelecionada());
												carregarGridCurriculo();
												bprofissionalCur = null;

											}

											public void onFailure(
													Throwable caught) {
												ErrorDialogBox erro = new ErrorDialogBox(
														"Ocorreu um erro na exclusão do arquivo "
																+ caught
																		.getMessage());
												erro.center();
												erro.show();
											}
										};
										Util.getService().excluirCurriculo(
												getBprofissionalCur().Id,
												callbackExclusao);
									}
								}
							});
					confirmacao.center();
					confirmacao.show();
				} else {
					InformationDialogBox informacao = new InformationDialogBox(
							"Selecione um item da lista");
					informacao.center();
					informacao.show();
				}
			}
		});
		btnVerdetalhes.addClickListener(new ClickListener() {
			public void onClick(Widget sender) {
				if (bprofissionalCur != null) {
					ADetalhesProfissionalCurriculo dProfCurso = new ADetalhesProfissionalCurriculo(
							bprofissionalCur);
					dProfCurso.center();
					dProfCurso.show();
				} else {
					InformationDialogBox informacao = new InformationDialogBox(
							"Selecione um item da lista");
					informacao.center();
					informacao.show();
				}
			}
		});
		vp.add(resultadoGrid);
		HorizontalPanel hpButton = new HorizontalPanel();
		hpButton.add(btnCadCurriculo);
		hpButton.add(btnExcluirCurriculo);
		hpButton.add(btnVerdetalhes);
		vp.add(hpButton);
		vp.setSize("100%", "0%");

		btnRefreshGrid.addClickListener(new ClickListener() {
			public void onClick(Widget sender) {
				carregarGridCurriculo();
			}
		});

		this.add(vp, DockPanel.CENTER);
	}

	private void addContagem(int totalResultado) {
		resultadoGrid.setWidget(totalResultado + 1, 0, new HTML(
				"Total de curriculos encontrados: " + totalResultado));
		resultadoGrid.getFlexCellFormatter().setColSpan(totalResultado + 1, 0,
				3);
		resultadoGrid.getFlexCellFormatter().setAlignment(totalResultado + 1,
				0, HasHorizontalAlignment.ALIGN_RIGHT,
				HasVerticalAlignment.ALIGN_MIDDLE);
		resultadoGrid.getFlexCellFormatter().setStyleName(totalResultado + 1,
				0, "resultadoGridContagem");

	}

	private void setarEstiloGrid() {

		resultadoGrid.getFlexCellFormatter().setStyleName(0, 0, "gridCampos");
		resultadoGrid.getFlexCellFormatter().setStyleName(0, 1, "gridCampos");
		resultadoGrid.getFlexCellFormatter().setStyleName(0, 2, "gridCampos");
		resultadoGrid.getFlexCellFormatter().setStyleName(0, 3, "gridCampos");

		resultadoGrid.setStyleName("gridCampos");
	}

	private void setarEstiloLinhaSelecionada(int rowline) {

		if (pastRow != -1) {
			resultadoGrid.getFlexCellFormatter().setStyleName(pastRow, 0,
					"resultadoGridLinhaNaoSelecionada");
			resultadoGrid.getFlexCellFormatter().setStyleName(pastRow, 1,
					"resultadoGridLinhaNaoSelecionada");
			resultadoGrid.getFlexCellFormatter().setStyleName(pastRow, 2,
					"resultadoGridLinhaNaoSelecionada");
			resultadoGrid.getFlexCellFormatter().setStyleName(pastRow, 3,
					"resultadoGridLinhaNaoSelecionada");
		}
		if (rowline > 0) {
			resultadoGrid.getFlexCellFormatter().setStyleName(rowline, 0,
					"resultadoGridLinhaSelecionada");
			resultadoGrid.getFlexCellFormatter().setStyleName(rowline, 1,
					"resultadoGridLinhaSelecionada");
			resultadoGrid.getFlexCellFormatter().setStyleName(rowline, 2,
					"resultadoGridLinhaSelecionada");
			resultadoGrid.getFlexCellFormatter().setStyleName(rowline, 3,
					"resultadoGridLinhaSelecionada");
		}
		pastRow = rowline;
	}

	public void carregarGridCurriculo() {
		listCurriculo.clear();
		AsyncCallback<ArrayList<BeanProfissionalCurriculo>> clCurriculos = new AsyncCallback<ArrayList<BeanProfissionalCurriculo>>() {
			public void onSuccess(ArrayList<BeanProfissionalCurriculo> result) {
				int linha = 1;
				for (Iterator<BeanProfissionalCurriculo> iterator = result
						.iterator(); iterator.hasNext();) {
					BeanProfissionalCurriculo beanProfissionalCurriculo = (BeanProfissionalCurriculo) iterator
							.next();
					resultadoGrid.setWidget(linha, 0, new HTML(
							beanProfissionalCurriculo.getId() + ""));
					resultadoGrid.setWidget(linha, 1, new HTML(
							beanProfissionalCurriculo.getDataCriacao()));
					resultadoGrid.setWidget(linha, 2, new HTML(
							beanProfissionalCurriculo.getUltimaAtualizacao()));
					resultadoGrid.setWidget(linha, 3, new HTML(
							beanProfissionalCurriculo.getComentario()));
					listCurriculo.add(beanProfissionalCurriculo);
					// esconde o campo de id do curriculo profissional
					resultadoGrid.getFlexCellFormatter().setVisible(linha++, 0,
							false);

				}
				addContagem(listCurriculo.size());
				setRow(linha);
			}

			public void onFailure(Throwable caught) {
				ErrorDialogBox erro = new ErrorDialogBox(
						"Erro ao buscar profissional currisulo");
				erro.center();
				erro.show();
			}

		};
		Util.getService().getCurriculos(clCurriculos);

	}

	public void setBprofissionalCur(BeanProfissionalCurriculo bprofissionalCur) {

		this.bprofissionalCur = bprofissionalCur;
	}

	public BeanProfissionalCurriculo getBprofissionalCur() {

		return bprofissionalCur;
	}

	public void habilitarBotoes(Boolean value) {

		btnExcluirCurriculo.setEnabled(value);
		btnVerdetalhes.setEnabled(value);

	}

	public void setRow(Integer row) {
		this.row = row;
	}

	public Integer getRow() {

		return row;
	}

	public Button getBtnCadCurriculo() {

		return btnCadCurriculo;
	}

	public void setBtnCadCurriculo(Button btnCadCurriculo) {

		this.btnCadCurriculo = btnCadCurriculo;
	}

	public Button getBtnExcluirCurriculo() {

		return btnExcluirCurriculo;
	}

	public void setBtnExcluirCurriculo(Button btnExcluirCurriculo) {

		this.btnExcluirCurriculo = btnExcluirCurriculo;
	}

	public Button getBtnVerdetalhes() {

		return btnVerdetalhes;
	}

	public void setBtnVerdetalhes(Button btnVerdetalhes) {

		this.btnVerdetalhes = btnVerdetalhes;
	}

	public static int getIdprofissionalAssinante() {

		return idprofassinante;
	}

	public void setLinhaSelecionada(Integer linhaSelecionada) {
		this.linhaSelecionada = linhaSelecionada;
	}

	public Integer getLinhaSelecionada() {
		return linhaSelecionada;
	}

	public void setBtnRefreshGrid(Button btnRefreshGrid) {
		this.btnRefreshGrid = btnRefreshGrid;
	}

	public Button getBtnRefreshGrid() {
		return btnRefreshGrid;
	}

	public void onWindowResized(int width, int height) {
		int largura = width - this.getAbsoluteLeft() - 9;
		if (largura < 1) {
			largura = 1;
		}
		int altura = height - this.getAbsoluteTop() - 9;
		if (altura < 1) {
			altura = 1;
		}
		this.setPixelSize(largura, altura);
	}

}
